#define __build_read_lock_ptr(rw, helper) \
asm volatile(LOCK "subl $1,(%0)\n\t" \
- "js 2f\n" \
+ "jns 1f\n\t" \
+ "call " helper "\n\t" \
"1:\n" \
- ".section .text.lock,\"ax\"\n" \
- "2:\tcall " helper "\n\t" \
- "jmp 1b\n" \
- ".previous" \
::"a" (rw) : "memory")
#define __build_read_lock_const(rw, helper) \
asm volatile(LOCK "subl $1,%0\n\t" \
- "js 2f\n" \
- "1:\n" \
- ".section .text.lock,\"ax\"\n" \
- "2:\tpush %%"__OP"ax\n\t" \
+ "jns 1f\n\t" \
+ "push %%"__OP"ax\n\t" \
"lea %0,%%"__OP"ax\n\t" \
"call " helper "\n\t" \
"pop %%"__OP"ax\n\t" \
- "jmp 1b\n" \
- ".previous" \
+ "1:\n" \
:"=m" (*(volatile int *)rw) : : "memory")
#define __build_read_lock(rw, helper) do { \
#define __build_write_lock_ptr(rw, helper) \
asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
- "jnz 2f\n" \
+ "jz 1f\n\t" \
+ "call " helper "\n\t" \
"1:\n" \
- ".section .text.lock,\"ax\"\n" \
- "2:\tcall " helper "\n\t" \
- "jmp 1b\n" \
- ".previous" \
::"a" (rw) : "memory")
#define __build_write_lock_const(rw, helper) \
asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
- "jnz 2f\n" \
- "1:\n" \
- ".section .text.lock,\"ax\"\n" \
- "2:\tpush %%"__OP"ax\n\t" \
+ "jz 1f\n\t" \
+ "push %%"__OP"ax\n\t" \
"lea %0,%%"__OP"ax\n\t" \
"call " helper "\n\t" \
"pop %%"__OP"ax\n\t" \
- "jmp 1b\n" \
- ".previous" \
+ "1:\n" \
:"=m" (*(volatile int *)rw) : : "memory")
#define __build_write_lock(rw, helper) do { \
static inline void _raw_spin_lock(raw_spinlock_t *lock)
{
asm volatile (
- "1: lock; decb %0 \n"
- " js 2f \n"
- ".section .text.lock,\"ax\"\n"
+ "1: lock; decw %0 \n"
+ " jns 3f \n"
"2: rep; nop \n"
- " cmpb $0,%0 \n"
+ " cmpw $0,%0 \n"
" jle 2b \n"
" jmp 1b \n"
- ".previous"
+ "3:"
: "=m" (lock->lock) : : "memory" );
}
{
ASSERT(_raw_spin_is_locked(lock));
asm volatile (
- "movb $1,%0"
+ "movw $1,%0"
: "=m" (lock->lock) : : "memory" );
}
static inline int _raw_spin_trylock(raw_spinlock_t *lock)
{
- char oldval;
+ s16 oldval;
asm volatile (
- "xchgb %b0,%1"
- :"=q" (oldval), "=m" (lock->lock)
+ "xchgw %w0,%1"
+ :"=r" (oldval), "=m" (lock->lock)
:"0" (0) : "memory" );
return (oldval > 0);
}